package com.example.dingtalklogin.manager.dingtalk;

import lombok.Data;

import java.util.List;
import java.util.Map;

/**
 * 发送卡片消息
 * https://open.dingtalk.com/document/orgapp-server/send-dingtalk-interactive-cards
 * @author xuzhen97
 */
@Data
public class InteractiveCardSendRequest {

    /**
     * 互动卡片的消息模板ID。创建消息模板后可获取模板ID
     */
    private String cardTemplateId;

    /**
     * 群ID，可以通过调用创建场景群接口获取。
     */
    private String openConversationId;

    /**
     * 说明
     * 单聊时receiverUserIdList填写员工ID，最大值20。
     * 群聊时receiverUserIdList填写员工ID。表示当前对应ID的群内员工可见。
     * 群聊时receiverUserIdList参数不填时，表示当前群内所有员工可见。
     */
    private List<String> receiverUserIdList;

    /**
     * 说明 是由开发者自己生成并作为入参传递给钉钉的，钉钉只在对应使用到outTrackId的场景
     * ，帮助开发者对TrackId进行记录。
     */
    private String outTrackId;

    /**
     * 用于发送卡片的机器人编码。
     */
    private String robotCode;

    /**
     * 发送的会话类型：
     * 0：单聊
     * 1：群聊
     * 说明 单聊时openConversationId不用填写，receiverUserIdList填写员工ID，最大值20。
     */
    private Integer conversationType;

    /**
     * 可控制卡片回调时的路由Key，用于指定特定的callbackUrl。
     * 说明 可以为空，不填写默认无需回调。
     */
    private String callbackRouteKey;

    /**
     * 卡片数据
     */
    private CardData cardData;

    /**
     * 指定用户可见的按钮列表。
     * key：用户userId。
     * value：用户数据。
     */
    private Map<String, Object> privateData;

    /**
     * 企业机器人ID。
     * 说明 robotCode或chatBotId二选一必填。
     */
    private String chatBotId;

    /**
     * 用户ID类型：
     * 1（默认）：userid模式
     * 2：unionId模式
     * 对应receiverUserIdList、privateData字段关于用户id的值填写方式。
     */
    private Integer userIdType;

    /**
     * 消息@人。格式：{"key":"value"}。
     * key：用户ID，根据userIdType设置。
     * value：用户名。
     * 例如：{123456:"钉三多"}
     * 说明 如果key、value都为**@ALL**则判断@所有人。
     */
    private Map<String, String> atOpenIds;

    /**
     * 是否支持转发：
     * true：支持
     * false：不支持
     */
    private CardOption cardOptions;

    @Data
    public static class CardData{
        /**
         * 卡片模板内容替换参数，普通文本类型。
         */
        private Map<String, String> cardParamMap;
        /**
         * 卡片模板内容替换参数，多媒体类型。
         */
        private Map<String, String> cardMediaIdParamMap;
    }

    @Data
    public static class CardOption{
        private Boolean supportForward;
    }
}
